﻿#pragma once

#include "BaseGraphicView.h"

#include <boost/signal.hpp>
#include <boost/ptr_container/ptr_vector.hpp>
#include <SFML/Graphics.hpp>
#include "../../abstract/IAccusationView.h"
#include "../../helpers/graphic/accusation/DecisionDialog.h"
#include "../../helpers/graphic/accusation/AccusationCardsDialog.h"
#include "../../../utils/gui/Form.h"
#include "../../../domain/models/CardSet.h"
#include "../../../domain/models/Player.h"


namespace Views {
	/**
	* Widoki wykorzystujące graficzny interfejs użytkownika.
	*/
	namespace Graphic {
		class AccusationView: public virtual IAccusationView, public BaseGraphicView
		{
			Helpers::Graphic::Accusation::DecisionDialog* decision_dialog; /**< Okno dialogowe z wyborem decyzji */
			Helpers::Graphic::Accusation::AccusationCardsDialog* accusation_cards_dialog; /**< Okno dialogowe z wyborem kart w oskarżeniu */

		public:
			/**
			* @param form Główna formatka aplikacji
			*/
			AccusationView(Utils::GUI::Form*);

			/**
			* Otwiera okno dialogowe z pytaniem, czy gracz chce dokonać oskarżenia
			*/
			virtual void askIfPlayerWantsToPerformAccusation();
			/**
			* Otwiera okno dialogowe z pytaniem o karty, jakie gracz chce wybrać w oskarżeniu
			* @param cards Wszystkie karty w grze
			*/
			virtual void askForCardsInAccusation(Cards::CardsCollection);

		protected:
			/**
			* Funkcja wywoływana po zamknięciu okna z pytaniem o decyzję. Usuwa to okno i wywołuje playerDecisionSetEvent
			* @param decision Decyzja, czy podejmować oskarżenie
			*/
			virtual void onDecisionSet(bool decision);
			/**
			* Funkcja wywoływana po zamknięciu okna z pytaniem o karty. Usuwa to okno i wywołuje cardsInAccusationSetEvent
			* @param cards Karty w oskarżeniu
			*/
			virtual void onCardsSet(Cards::CardSet cards);
		};
	}
}

